home *** CD-ROM | disk | FTP | other *** search
- /* GadTools layout toolkit
- **
- ** Copyright © 1993-1995 by Olaf `Olsen' Barthel
- ** Freely distributable.
- **
- ** :ts=4
- */
-
- #include "gtlayout_global.h"
-
- #ifdef DO_MENUS
-
- /* LTP_NewMenu():
- *
- * Create a new menu, based on the Screen and Font given.
- */
-
- RootMenu * __regargs
- LTP_NewMenu(struct Screen *Screen,struct TextAttr *TextAttr,struct Image *AmigaGlyph,struct Image *CheckGlyph,LONG *Error)
- {
- if(Screen)
- {
- APTR Pool;
-
- // Start cleanly
-
- *Error = 0;
-
- // Wrap all the allocations into a pool
-
- if(Pool = AsmCreatePool(MEMF_ANY | MEMF_PUBLIC | MEMF_CLEAR,1024,1024,SysBase))
- {
- struct RootMenu *Root;
-
- // Create the root
-
- if(Root = (struct RootMenu *)AsmAllocPooled(Pool,sizeof(struct RootMenu),SysBase))
- {
- Root -> Pool = Pool;
-
- if(TextAttr)
- Root -> TextAttr = TextAttr;
- else
- Root -> TextAttr = Screen -> Font;
-
- // Open the menu font
-
- if(Root -> Font = OpenFont(Root -> TextAttr))
- {
- // Get the drawing information
-
- if(Root -> DrawInfo = GetScreenDrawInfo(Screen))
- {
- // Fill in the dummy rastport
-
- InitRastPort(&Root -> RPort);
-
- Root -> RPort . BitMap = Screen -> RastPort . BitMap;
-
- SetFont(&Root -> RPort,Root -> Font);
-
- // Get the text rendering pen
-
- if(Root -> DrawInfo -> dri_Version < 2)
- Root -> TextPen = Root -> DrawInfo -> dri_Pens[DETAILPEN];
- else
- Root -> TextPen = Root -> DrawInfo -> dri_Pens[BARDETAILPEN];
-
- // Something to remember
-
- Root -> Screen = Screen;
-
- // Let's hope it won't grow in the future
-
- CopyMem(Root -> TextAttr,&Root -> BoldAttr,sizeof(struct TTextAttr));
-
- // Make it boldface
-
- Root -> BoldAttr . tta_Style |= FSF_BOLD;
-
- // Initialize the lists
-
- NewList((struct List *)&Root -> MenuList);
- NewList((struct List *)&Root -> ItemList);
-
- // Get the glyph widths
-
- if(CheckGlyph)
- {
- GetAttr(IA_Width, CheckGlyph,&Root -> CheckWidth);
- GetAttr(IA_Height, CheckGlyph,&Root -> CheckHeight);
- }
- else
- {
- // No glyph is provided, use the default values
-
- if(V39)
- {
- struct Image *Glyph;
-
- if(Glyph = NewObject(NULL,SYSICLASS,
- SYSIA_DrawInfo, Root -> DrawInfo,
- SYSIA_Which, MENUCHECK,
- SYSIA_ReferenceFont, Root -> Font,
- TAG_DONE))
- {
- GetAttr(IA_Width, Glyph,&Root -> CheckWidth);
- GetAttr(IA_Height, Glyph,&Root -> CheckHeight);
-
- DisposeObject(Glyph);
- }
- }
-
- if(!Root -> CheckWidth)
- Root -> CheckWidth = 15;
-
- if(!Root -> CheckHeight)
- Root -> CheckHeight = 8;
- }
-
- if(AmigaGlyph)
- {
- GetAttr(IA_Width, AmigaGlyph,&Root -> AmigaWidth);
- GetAttr(IA_Height, AmigaGlyph,&Root -> AmigaHeight);
- }
- else
- {
- // No glyph is provided, use the default values
-
- if(V39)
- {
- struct Image *Glyph;
-
- if(Glyph = NewObject(NULL,SYSICLASS,
- SYSIA_DrawInfo, Root -> DrawInfo,
- SYSIA_Which, AMIGAKEY,
- SYSIA_ReferenceFont, Root -> Font,
- TAG_DONE))
- {
- GetAttr(IA_Width, Glyph,&Root -> AmigaWidth);
- GetAttr(IA_Height, Glyph,&Root -> AmigaHeight);
-
- DisposeObject(Glyph);
- }
- }
-
- if(!Root -> AmigaWidth)
- Root -> AmigaWidth = 23;
-
- if(!Root -> AmigaHeight)
- Root -> AmigaHeight = 8;
- }
-
- // Establish default menu item height
-
- Root -> ItemHeight = Root -> RPort . TxHeight;
-
- if(Root -> CheckHeight > Root -> ItemHeight)
- Root -> ItemHeight = Root -> CheckHeight;
-
- if(Root -> AmigaHeight > Root -> ItemHeight)
- Root -> ItemHeight = Root -> AmigaHeight;
-
- Root -> ItemHeight += 2;
-
- return(Root);
- }
- else
- *Error = ERROR_NO_FREE_STORE;
-
- CloseFont(Root -> Font);
- }
- else
- *Error = ERROR_OBJECT_NOT_FOUND;
- }
- else
- *Error = ERROR_NO_FREE_STORE;
-
- AsmDeletePool(Pool,SysBase);
- }
- else
- *Error = ERROR_NO_FREE_STORE;
- }
- else
- *Error = ERROR_REQUIRED_ARG_MISSING;
-
- return(NULL);
- }
-
- #endif /* DO_MENUS */
-